package dao

import (
	__ "activity_srv/basic/proto"
	"activity_srv/handler/models"
	"errors"
	"fmt"
	"time"
)

/*
CreateGroupPGoods 创建拼团商品

该函数用于创建拼团商品，包含完整的业务逻辑验证：
1. 验证关联商品是否存在
2. 验证时间设置的完整性
3. 验证时间格式的正确性
4. 验证开始时间不能晚于结束时间
5. 验证开始时间至少在当前时间30分钟之后
6. 根据结束时间自动设置商品状态（如果结束时间已过，则设置为已结束状态）

参数:
- in: CreateGroupPGoodsReq 请求参数，包含商品基本信息和时间设置
- groupPGoods: GroupPGoods 拼团商品模型对象

返回值:
- error: 创建成功返回nil，失败返回相应错误信息
*/
func CreateGroupPGoods(in *__.CreateGroupPGoodsReq, groupPGoods models.GroupPGoods) error {
	var goods models.Goods
	goods.Id = uint32(in.GoodsId)
	if err := goods.FindGoods(); err != nil {
		return errors.New("商品不存在")
	}

	// 验证限时拼团
	if in.StartTime == "" || in.EndTime == "" {
		return errors.New("限时拼团必须设置开始和结束时间")
	}

	// 解析时间字符串
	startTime, err := time.Parse("2006-01-02 15:04:05", in.StartTime)
	if err != nil {
		return errors.New("开始时间格式错误")
	}

	endTime, err := time.Parse("2006-01-02 15:04:05", in.EndTime)
	if err != nil {
		return errors.New("结束时间格式错误")
	}

	// 检查开始时间是否晚于结束时间
	if startTime.After(endTime) {
		return errors.New("开始时间不能晚于结束时间")
	}

	// 开始时间至少要在当前时间之后30分钟，留出审核时间
	now := time.Now()
	if startTime.Before(now.Add(30 * time.Minute)) {
		return errors.New("开始时间必须在当前时间30分钟之后")
	}

	// 确定商品状态
	status := uint32(0) // 默认为未发布状态
	// 如果结束时间已经过了，设置状态为已结束
	if endTime.Before(now) {
		status = 2 // 已结束状态
	}

	groupPGoods = models.GroupPGoods{
		GoodsId:      uint64(in.GoodsId),
		PingPrice:    float64(in.PingPrice),
		Stock:        uint64(in.Stock),
		People:       uint32(in.People),
		GoodsName:    in.GoodsName,
		GoodsImg:     in.GoodsImg,
		YuanPrice:    goods.GoodsPrice,
		LimitPerson:  uint32(in.LimitPerson),
		StartTime:    in.StartTime,
		EndTime:      in.EndTime,
		PGoodsStatus: uint8(status),
	}

	if err := groupPGoods.CreateGroupPGoods(); err != nil {
		return errors.New("拼团商品添加失败")
	}
	return nil
}

//拼团商品列表

func GroupPGoodsList(in *__.GroupPGoodsListReq) ([]*__.GroupPGoodsList, error) {
	var GroupPGoods models.GroupPGoods
	list, err := GroupPGoods.GroupPGoodsList(int(in.Page), int(in.PageSize))
	if err != nil {
		return nil, errors.New("商品列表查询错误" + err.Error())
	}
	fmt.Println(list)
	var listPing []*__.GroupPGoodsList
	for _, i := range list {
		listPing = append(listPing, &__.GroupPGoodsList{
			Id:          int64(i.Id),
			GoodsId:     int64(i.GoodsId),
			PingPrice:   int64(i.PingPrice),
			People:      int64(i.People),
			GoodsName:   i.GoodsName,
			GoodsImg:    i.GoodsImg,
			YuanPrice:   int64(i.YuanPrice),
			LimitPerson: int64(i.LimitPerson),
			StartTime:   i.StartTime,
			EndTime:     i.EndTime,
		})
	}
	return listPing, err
}

/*
UpdateGroupPGoods 修改拼团商品

该函数用于修改已存在的拼团商品信息，包含完整的业务逻辑验证：
1. 验证要修改的商品是否存在
2. 验证时间设置的完整性
3. 验证时间格式的正确性
4. 验证开始时间不能晚于结束时间
5. 验证开始时间至少在当前时间30分钟之后
6. 根据商品当前状态进行相应的修改限制：
  - 已发布状态的商品在活动期间不能修改时间
  - 已结束的商品不能修改为未来时间

参数:
- in: GroupPGoodsUpdateReq 请求参数，包含要修改的商品ID和新信息

返回值:
- uint64: 修改成功的商品ID
- error: 修改成功返回nil，失败返回相应错误信息
*/
func UpdateGroupPGoods(in *__.GroupPGoodsUpdateReq) (uint64, error) {
	// 查找原有商品信息
	var p models.GroupPGoods
	p.Id = uint64(in.Id)
	if err := p.FindIdGroupPGoods(); err != nil {
		return 0, errors.New("未找到要修改的拼团商品")
	}

	// 设置更新字段
	p.Id = uint64(in.Id)
	p.GoodsId = uint64(in.GoodsId)
	p.PingPrice = float64(in.PingPrice)
	p.LimitPerson = uint32(in.LimitPerson)
	p.StartTime = in.StartTime
	p.EndTime = in.EndTime

	// 验证限时拼团时间设置
	if p.StartTime == "" || p.EndTime == "" {
		return 0, errors.New("限时拼团必须设置开始和结束时间")
	}

	// 解析时间字符串
	startTime, err := time.Parse("2006-01-02 15:04:05", p.StartTime)
	if err != nil {
		return 0, err
	}

	endTime, err := time.Parse("2006-01-02 15:04:05", p.EndTime)
	if err != nil {
		return 0, err
	}

	// 检查开始时间是否晚于结束时间
	if startTime.After(endTime) {
		return 0, errors.New("开始时间不能晚于结束时间")
	}
	// 开始时间至少要在当前时间之后30分钟，留出审核时间
	now := time.Now()
	if startTime.Before(now.Add(30 * time.Minute)) {
		return 0, errors.New("开始时间必须在当前时间30分钟之后")
	}
	// 检查商品状态，已发布的商品不能随意修改
	if p.PGoodsStatus == 1 { // 假设1为已发布状态
		// 检查是否在活动期间
		if now.After(startTime) && now.Before(endTime) {
			return 0, errors.New("商品正在活动中，不能修改时间")
		}
	}
	// 如果商品已结束，不能修改为未来时间
	if p.PGoodsStatus == 2 { // 假设2为已结束状态
		if now.Before(startTime) || now.Before(endTime) {
			return 0, errors.New("商品已结束，不能修改为未来时间")
		}
	}
	if err := p.UpdateGroupPGoods(); err != nil {
		return 0, errors.New("修改拼团商品失败")
	}
	return p.Id, err
}

/*
DeleteGroupPGoods 删除拼团商品

该函数用于删除拼团商品，采用逻辑删除方式：
1. 验证要删除的商品是否存在
2. 通过ID删除拼团商品
3. 修改状态为3已删除状态

返回值:
- error: 删除成功返回nil，失败返回相应错误信息
*/
func DeleteGroupPGoods(in *__.GroupPGoodsDelReq) error {
	// 查找要删除的商品信息
	var groupPGoods models.GroupPGoods
	groupPGoods.Id = uint64(in.Id)
	if err := groupPGoods.DelGroupPGoods(); err != nil {
		return errors.New("删除拼团商品失败")
	}
	groupPGoods.PGoodsStatus = 3 // 设置为已删除状态（逻辑删除）
	if err := groupPGoods.GetGoodsByStatus(); err != nil {
		return errors.New("修改拼图商品状态失败")
	}
	return nil
}
